Don't try to memcpy zero bytes; sometimes the source pointer is NULL, and that's UB. Thanks to Nuno Lopes for the catch. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@238666 91177308-0d34-0410-b5e6-96231b3b80d8 
diff --git a/include/memory b/include/memory index a0e7a8b..a004c89 100644 --- a/include/memory +++ b/include/memory 
@@ -621,6 +621,8 @@  #pragma GCC system_header  #endif   +extern "C" int printf(const char * __restrict, ...); +  _LIBCPP_BEGIN_NAMESPACE_STD    // addressof moved to <__functional_base> @@ -1521,7 +1523,8 @@  __construct_forward(allocator_type& __a, _Tp* __begin1, _Tp* __end1, _Tp*& __begin2)  {  ptrdiff_t _Np = __end1 - __begin1; - _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp)); + if (_Np > 0) + _VSTD::memcpy(__begin2, __begin1, _Np * sizeof(_Tp));  __begin2 += _Np;  }   @@ -1549,7 +1552,8 @@  {  typedef typename remove_const<_Tp>::type _Vp;  ptrdiff_t _Np = __end1 - __begin1; - _VSTD::memcpy(const_cast<_Vp*>(__begin2), __begin1, _Np * sizeof(_Tp)); + if (_Np > 0) + _VSTD::memcpy(const_cast<_Vp*>(__begin2), __begin1, _Np * sizeof(_Tp));  __begin2 += _Np;  }   @@ -1580,7 +1584,8 @@  {  ptrdiff_t _Np = __end1 - __begin1;  __end2 -= _Np; - _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp)); + if (_Np > 0) + _VSTD::memcpy(__end2, __begin1, _Np * sizeof(_Tp));  }    private: